package ru.vt;

import ru.chezclif.lern.conread.DataBuffer;
import ru.chezclif.lern.conread.Preconditions;
import ru.chezclif.lern.conread.PropertyElements;
import ru.chezclif.lern.conread.PropertyManager;
import ru.chezclif.lern.conread.readers.PropertyReader;
import java.util.List;

/**
 * @author Vit
 * Класс для именованного конфига, загруженного из файла
 */
public class Config {
    /**
     * Название конфига
     */
    private String configName;
    /**
     * Хранилище с парами ключ-значение, а так же комментариев
     */
    private DataBuffer configList;

    /**
     *  Конструирование конфига, на основании уже существующего. Фактически создается отдельная копия.
     * @param config
     */
    public Config(Config config){
        Preconditions.notNull(config);
        this.configName=config.getConfigName();
        configList=new DataBuffer();
        for (PropertyElements propertyElements:config.getConfigList().getElements()){
                 configList.setSetting(propertyElements.getKey(),propertyElements.getValue());
        }
        this.configList.setHeaderComment(config.getHeaderComment());
        this.configList.setFooterComment(config.getFooterComment());
    }

    /**
     * Конструирование конфига на основании данных из загруженного файла
     * @param configName Название конфига
     * @param pseudoProtocol  Название специальной строки типа "<Расширение>:\\<Абсолютный путь к файлу>" необходима для работы парсера
     */
    public Config(String configName, String pseudoProtocol) {
        Preconditions.notNull(configName,pseudoProtocol);
        Preconditions.notBlank(configName,pseudoProtocol);
        this.configName = configName;
        PropertyManager propertyManagerAccess = new PropertyManager();
        PropertyReader propertyReader = propertyManagerAccess.getPropertyReader();
        propertyReader.readFile(pseudoProtocol);
        configList = propertyReader.getPropertiesData();
    }

    /**
     * Преобразование из расширения файла и абсолютного пути к файлу в специальную строку псевдопротокола для парсера
     * @param extensh Расширение
     * @param absolpath Абсолютный путь
     */
    public static String stringPseudoProtConvert(String extensh, String absolpath) {
        Preconditions.notNull(extensh,absolpath);
        Preconditions.notBlank(extensh,absolpath);
        return extensh + "://" + absolpath;
    }
    // Геттеры и сеттеры
    public String getConfigName() {
        return configName;
    }

    public void setConfigName(String configName) {
        Preconditions.notNull(configName);
        this.configName = configName;
    }

    public List<String> getConfigKeys(List<String> collectKey) {
        return configList.getKeys(collectKey);
    }

    public String getConfigSetting(String key) {
        return configList.getSetting(key);
    }

    public String getHeaderComment() {
        return configList.getHeaderComment();
    }

    public String getFooterComment() {
        return configList.getFooterComment();
    }

    public DataBuffer getConfigList() {
        return configList;
    }
}
